#ifndef _DMU_H_
#define _DMU_H_

#include "typedef.h"
#include "components/polsys_lib/polsys_lib.h"


#define DMU_DEV_INFO_ADDR   0X0000

#define DMU_RECORD_ADDR     0X0100

#define DMU_SETTINGS_ADDR   0X0200

#define DMU_STATUS_ADDR     0X0300


#define DMU_OUTING_FLAG         0XAA

#define DMU_MEASURE_RES_FLAG    0X55


// 设备信息 0X0000，此区域通常出厂后只读，烧录时写入。
typedef struct _dmu_dev_info_t
{
    u8 Format;       // 格式代码，固定0X00
    u8 FPOF;     // 首次上电标记，0X55：首次上电
    u8 Reserved1[2];
    u8 SN[16];      // 设备唯一序列号
    char PCBAModel[8];     // PCBA型号，例如：TS614AA1
    char Model[16];      // 设备型号，例如：DP71
    char Manu[16];  // 生产商
    char GDInfo[64];    // 其他设备信息
    u8 HVer[4];      // 硬件版本
    u8 SVer[4];  // 软件版本
    u16 MaxRxLen;   // 最大可接收数据长度
    u16 MaxTxLen;   // 最大发送数据长度
    u8 OChNum;      // 输出通道数
    u8 PointNum;    // 输出曲线的点数，最大值20。
    u8 SptMode;     // 支持的模式，1表示支持，0表示不支持，bit0-bit4分别表示5个模式：0：固定PWM；1：电压(平均值)；2：电压（有效值）；3：功率；4：温度。
    u8 RecMode;     // 推荐的输出模式，0：固定PWM；1：电压(平均值)；2：电压（有效值）；3：功率；4：温度。
    u16 OutVolMax; // 最大输出电压，单位mV。
    u16 OutPowerMax;    // 最大输出功率，单位mW。
    u16 OutTempMax; // 最大输出温度，单位0.1℃。
    u8 Reserved2[2];
    u16 DesignRes[4];   // 设计阻值（4个），单位mΩ。
    u32 DefaultBaud;    // 默认波特率
    u32 MaxBaud;        // 支持的最大波特率
} dmu_dev_info_t;

// 记录信息 0x0100，此区域通常出厂后只读，默认全为0，每次输出后更新。
typedef struct _dmu_record
{
    u32 TotalPuffs;     // 总输出口数
    u32 TotalTime;      // 总输出时长：0.1s
    u32 TripPuffs;      // 小计输出口数
    u32 TripTime;       // 小计输出时长：0.1s
    u16 LastTime;       // 上次输出时间，单位0.1s
    u8 Reserved[2];
    u16 LastRealParam[20]; // 上次输出实际输出曲线，20个点
} dmu_record_t;


// 设置参数 0x0200，此区域通常出厂后可读写
typedef struct _dmu_seting_t
{
    u8 Reserve1[2]; // 保留
    u8 AutoSet;     // 自动设置。1：允许依据装入的雾化器自动设置输出参数
    u8 Mode;        // 输出模式。0：固定PWM；1：电压(平均值)；2：电压（有效值）；3：功率；4：温度。
    u16 RestTime;   // 休息时间。单位0.1s。
    u16 Timeout;    // 超时时间。单位0.1s。
    u16 Param[20];  // 输出参数，20个点。
} dmu_seting_t;

// 所有掉电保存数据，这些数据通常保存在FLASH中。
typedef struct _dmu_stored_t
{
    dmu_dev_info_t DevInfo;
    u8 Reserved1[92];
    dmu_record_t Record;
    u8 Reserved2[196];
    dmu_seting_t Settings;
}dmu_stored_t;

VERIFY_SIZE(dmu_stored_t, 560);

// 运行状态信息 0x2000，此区域通常出厂后只读，保存在RAM中，实时更新。
typedef struct _dmu_status_t
{
    u16 BatVoltage;         // 电池电压（不输出时），单位mV。
    u16 LoadBatVoltage;     // 输出时电池电压，单位mV。
    u16 LoadRes[4];         // 实测发热丝阻值（4个），单位mΩ。
    u8 FactTrig;         // 出厂保护触发标记，1：已触发出厂保护。
    u8 MicErr;           // 咪头状态。0：正常，1：输出时间过长，2：输出次数过多。
    u8 Reserved[2];
    u8 Outing;           // 输出标记。1：正在输出。
} dmu_status_t;



extern volatile dmu_status_t Dmu_Status;

/**
 * 将 Dmu_Status 更新保存到FLASH中。通常在输出前调用，确保短路导致复位后不丢失数据。
*/ 
void Dmu_SaveStatus();

/**
 * 加载FLASH中保存的Dmu_Status。
*/
void Dmu_LoadStatus();

#endif
